package com.tea.zxql.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.json.JSONUtil;
import com.tea.zxql.constants.KeysConstants;
import com.tea.zxql.domain.Sim;
import com.tea.zxql.domain.dto.PageDTO;
import com.tea.zxql.domain.dto.SimDTO;
import com.tea.zxql.domain.query.SimQuery;
import com.tea.zxql.domain.vo.SimVO;
import com.tea.zxql.service.SimService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassDescription:
 * @ClassName: SimController
 * @JdkVersion: 17
 * @Author: HYC
 * @Created: 2025/7/28 15:00
 * @Version 1.0
 */
@Tag(name = "设备管理")
@RestController
@RequestMapping("/sim")
public class SimController {

    private static final Logger log = LoggerFactory.getLogger(SimController.class);
    @Autowired
    private SimService simService;


    /**
     * 分页查询SIM卡信息
     *
     * @param query 查询条件封装对象
     * @return 返回分页数据结果
     */
    @Operation(summary = "分页获取设备列表")
    @GetMapping("/getPage")
    @SaCheckPermission("system.sim.query")
    public SaResult getList(@ModelAttribute SimQuery query){

        PageDTO<SimDTO> pageDTO = simService.getPage(query);


        return SaResult.data(pageDTO);
    }


    /**
     * 接收硬件传递的SIM卡数据并更新，无需登录验证
     *
     * @param sim 硬件上传的SIM卡数据对象
     * @return 操作结果
     */
    @Operation(summary = "硬件访问接口：接收硬件数据")
    @PostMapping("/updateSim")
    public SaResult updateSim(@RequestBody SimDTO sim){

        log.info("接收硬件数据：{}", sim);
        log.info("密钥比对:{}", KeysConstants.SIM_KEY.equals(sim.getSimKey()));

        simService.updateSimById(sim);

        return SaResult.ok();
    }


    /**
     * 获取最新的传感器数据
     *
     * @return 最新传感器数据对象
     */
    @Operation(summary = "获取最新的传感器数据")
    @GetMapping("/sensor/data/latest")
    public SaResult getLatestSensorData(){

        String simJSON = simService.getSimData();

        return SaResult.data(JSONUtil.toBean(simJSON, Sim.class));
    }



    /**
     * 控制设备状态（如LED、蜂鸣器等）
     *
     * @param sim 包含控制指令的SIM数据对象
     * @return 操作结果
     */
    @Operation(summary = "控制设备状态")
    @PostMapping("/device/control")
    public SaResult deviceControl(@RequestBody SimDTO sim){

        simService.updateDeviceStatus(sim);

        return SaResult.ok();
    }


    /**
     * 获取指定SIM卡ID对应的设备状态（供硬件调用）
     *
     * @param simId 设备的SIM卡ID
     * @return 设备状态信息
     */
    @Operation(summary = "硬件访问接口：获取设备状态")
    @GetMapping("/device/status/{simId}")
    public SaResult getDeviceStatus(@PathVariable("simId") String simId){


        SimVO sim = simService.getStatus(simId);


        return SaResult.data(sim);
    }



    /**
     * 判断设备是否已被标记为删除状态
     *
     * @param device 设备标识
     * @return 操作结果
     */
    @Operation(summary = "判断设备是否已被标记为删除状态")
    @GetMapping("/isStatusDelete/{device}")
    public SaResult isStatusDelete(@PathVariable("device") String device){

        simService.isStatusDelete(device);

        return SaResult.ok();
    }


    /**
     * 硬件主动更新LED或蜂鸣器状态时调用此接口
     *
     * @param sim 包含新状态的SIM数据对象
     * @return 操作结果
     */
    @Operation(summary = "硬件访问接口：硬件主动更新LED或蜂鸣器状态")
    @PostMapping("/device/status/update")
    public SaResult updateDeviceStatus(@RequestBody SimDTO sim){

        simService.deviceUpdateSataus(sim);

        return SaResult.ok();
    }

    /**
     * 前端获取指定SIM卡ID对应设备的LED和蜂鸣器状态
     *
     * @param simId 设备的SIM卡ID
     * @return LED和蜂鸣器状态信息
     */
    @Operation(summary = "获取设备LED和蜂鸣器状态")
    @GetMapping("/device/status/get/{simId}")
    public SaResult getLedAndBuzzerStatus(@PathVariable("simId") String simId){

        SimVO simVO = simService.getLedAndBuzzerStatus(simId);


        return SaResult.data(simVO);
    }




}
